class Premiacion < ActiveRecord::Base
  belongs_to :funcionario,:class_name=>'Usuario', :foreign_key=>:funcionario_id
  has_many :incidentes
  belongs_to :incidente
  delegate :nombre,:to=>:funcionario,:prefix=>true
  delegate :puntuacion_acumulada,:to=>:incidente,:prefix=>true

  before_create :set_datos
  after_create :marcar_hechos_significativos

  named_scope :antes_del, lambda{|fecha|{:conditions =>["fecha < ?",fecha]}}
  named_scope :puntos_acumulados_mayor_a, lambda{|valor|{:conditions =>["puntos_acumulados > ?",valor]}}
  named_scope :con_puntos_acumulados_disponibles, :conditions =>["puntos_acumulados_utilizados = ?",false]
  
  def puntuacion_total
    incidentes.empty? ? incidente_puntuacion_acumulada : incidentes.all.sum(&:puntuacion_registrada)
  end

  def puntos_acumulados
    id ? self[:puntos_acumulados] : puntos_a_acumular
  end

  def puntos_a_acumular
    puntuacion_maxima=incidente.nivel_premiacion.try(:hasta)
    puntuacion_total=incidente_puntuacion_acumulada
    puntuacion_total > puntuacion_maxima ? puntuacion_total-puntuacion_maxima : 0
  end

  def puntos_utilizados
    (puntos_acumulados != 0) ? (puntuacion_total-puntos_acumulados) : puntuacion_total
  end

  def set_datos
    self.funcionario=incidente.funcionario
    self.nivel_nombre=incidente.nivel_nombre
    self.nivel_escala=incidente.nivel_escala   
    self.puntos_acumulados=puntos_a_acumular
  end
  
  def marcar_hechos_significativos
    Incidente.update_all("premiacion_id = #{id}",["id in (?)",incidente.hechos_habilitados.map(&:id)])
    incidentes.each{|i| i.puntuacion_registrada=i.puntuacion}
    incidentes.each{|i| i.save}
    if puntos_acumulados==0
      premiaciones_id=incidente.premiaciones_anteriores.map(&:id)
      Premiacion.update_all(["puntos_acumulados_utilizados=?",true],['id in (?)',premiaciones_id]) unless premiaciones_id.empty?
    end
    self.save!
  end
end
